package com.example.demo.service;

import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.transaction.model.dto.CallResponse;
import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse;

import java.math.BigInteger;
import java.util.List;

/**
 * 区块链服务接口，专门处理与区块链的交互
 */
public interface BlockchainService {
    
    /**
     * 发送合约调用交易并获取响应
     * @param contractMethod 合约方法名
     * @param params 方法参数
     * @param userAddress 用户地址
     * @return 交易响应
     */
    TransactionResponse sendTransaction(String contractMethod, List<Object> params, String userAddress);
    
    /**
     * 发送合约调用查询
     * @param contractMethod 合约方法名
     * @param params 方法参数
     * @param userAddress 用户地址
     * @return 调用响应
     */
    CallResponse sendCall(String contractMethod, List<Object> params, String userAddress);
    
    /**
     * 解析交易返回的BigInteger值
     * @param transactionResponse 交易响应
     * @return 解析后的BigInteger
     */
    BigInteger parseReturnBigInteger(TransactionResponse transactionResponse);
    
    /**
     * 解析调用返回的BigInteger数组
     * @param callResponse 调用响应
     * @return BigInteger数组
     */
    List<BigInteger> parseReturnBigIntegerArray(CallResponse callResponse);
    
    /**
     * 解析调用返回的版权信息
     * @param callOutput 调用输出
     * @return 解析后的版权信息数组 [id, hash, owner, timestamp, valid]
     */
    String[] parseCopyrightInfo(String callOutput);
    
    /**
     * 获取用户的密钥对
     * @param userAddress 用户地址
     * @return 密钥对
     */
    CryptoKeyPair getUserKeyPair(String userAddress);
    
    /**
     * 添加交易回执监听器
     * @param listener 监听器
     */
    void addTransactionReceiptListener(TransactionReceiptListener listener);
    
    /**
     * 移除交易回执监听器
     */
    void removeTransactionReceiptListener();
    
    /**
     * 触发交易回执监听
     * @param receipt 交易回执
     */
    void triggerReceiptListener(TransactionReceipt receipt);
    
    /**
     * 交易回执监听器接口
     */
    interface TransactionReceiptListener {
        void onReceipt(TransactionReceipt receipt);
    }
} 